package path.calculator;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;

public class PermutationGenerator {
    private final int numberOfNodes;
    private final HashMap<Character, String> pathFromTo;

    public PermutationGenerator(int numberOfNodes) {
        this.numberOfNodes = numberOfNodes;
        this.pathFromTo = new HashMap<Character, String>();
    }

    public PermutationGenerator(int numberOfNodes, HashMap<Character, String> pathFromTo) {
        this.numberOfNodes = numberOfNodes;
        this.pathFromTo = pathFromTo;
    }

    public List<String> validPermutations() {
        List<Character> nodes = new ArrayList<Character>(numberOfNodes);
        for (int i = 0; i < numberOfNodes; ++i)
            nodes.add((char) ('a' + i));

        return generatePermutation(nodes);
    }

    private List<String> generatePermutation(List<Character> nodes) {
        List<String> result = new LinkedList<String>();

        if (nodes.size() == 0) {
            return result;
        }

        if (nodes.size() == 1) {
            result.add("" + nodes.get(0));
            return result;
        }

        Character c = nodes.get(0);
        List<Character> nodesMinusCurrent = new ArrayList<Character>(nodes);
        nodesMinusCurrent.remove(c);
        List<String> allSubCombinations = generatePermutation(nodesMinusCurrent);

        int currentLength = allSubCombinations.get(0).length();
        for (String current : allSubCombinations) {
            for (int index = 0; index <= currentLength; ++index) {
                String before = before(index, current);
                String after = after(index, current);
                if(
                String newCombination = String.format("%s%c%s", before, c, after);
                result.add(newCombination);
            }
        }
        return result;
    }

    private String before(int index, String current) {
        return current.substring(0, index);
    }

    private String after(int index, String current) {
        int length = current.length();
        if (index == length)
            return "";

        return current.substring(index, length);
    }
}